home *** CD-ROM | disk | FTP | other *** search
/ MacWorld 2000 January / Macworld (2000-01).dmg / Mac OS 9 Updaters / Utilities / Reaper 131 / Source Code / Reaper Trap.c < prev    next >
C/C++ Source or Header  |  1999-11-10  |  21KB  |  1,105 lines

  1. // AKUA Protos OneFile
  2. #include    "yLibCfg.h"
  3.  
  4. #include    "Reaper.h"
  5.  
  6. #include    "yAgtINIT.h"
  7. #include    "yAgtTRAP.h"
  8. #include    "yDraw.h"
  9. #include    "yFixedMath.h"
  10. #include    "yGlobal.h"
  11. #include    "yString.h"
  12.  
  13. #include    <Appearance.h>
  14.  
  15.  
  16.  
  17. //
  18. // For PPC Code resource
  19. #if            ISAPPC
  20. ProcInfoType    __procinfo = bpiObjAgt;
  21. #endif    //    ISAPPC
  22.  
  23.  
  24. // AKUA Statics Beg
  25. oaVal main(oaObj initBlkObj);
  26. static Ptr xaLMGetFCBSPtr(void);
  27. static SysProc tpLaunchX(LaunchPBPtr pb, OSErr * err);
  28. #if            ISAPPC
  29. static pascal OSErr xaLaunchPPC(LaunchPBPtr pb);
  30. #else    //    ISAPPC
  31. static pascal asm OSErr xaLaunch(void);
  32. #endif    //    ISAPPC
  33. static SysProc tpGet1ResourceX(ident kind, short resNum, Handle * retHdl);
  34. #if            ISAPPC
  35. static pascal Handle xaGet1ResourcePPC(ResType kind, short resNum);
  36. #else    //    ISAPPC
  37. static pascal asm Handle xaGet1Resource(ResType kind, short resID);
  38. #endif    //    ISAPPC
  39. static Handle tpNewHandleX(word tw, Size amt);
  40. #if            ISAPPC
  41. static pascal Handle xaNewHandlePPC(word tw, Size amt);
  42. static pascal Handle xaNewHandleSmartPPC(word tw, Size amt);
  43. #else    //    ISAPPC
  44. static pascal asm void xaNewHandle(void);
  45. static pascal asm void xaNewHandleSmart(void);
  46. #endif    //    ISAPPC
  47. static Ptr tpNewPtrX(word tw, Size amt);
  48. #if        ISAPPC
  49. static pascal Ptr xaNewPtrPPC(word tw, Size amt);
  50. #else
  51. static pascal asm void xaNewPtr(void);
  52. #endif    //    ISAPPC
  53. static SysProc tpDisposePtrX(word tw, Ptr p);
  54. #if            ISAPPC
  55. static pascal void xaDisposePtrPPC(word tw, Ptr p);
  56. #else    //    ISAPPC
  57. static pascal asm void xaDisposePtr(void);
  58. #endif    //    ISAPPC
  59. static PicHandle tpOpenPictureX(rect box);
  60. #if            ISAPPC
  61. static pascal PicHandle xaOpenPicturePPC(rect box);
  62. #else    //    ISAPPC
  63. static pascal asm void xaOpenPicture(void);
  64. #endif    //    ISAPPC
  65. static SysProc tpMaxApplZoneX(void);
  66. #if            ISAPPC
  67. static pascal void xaMaxApplZonePPC(void);
  68. #else    //    ISAPPC
  69. static pascal asm void xaMaxApplZone(void);
  70. #endif    //    ISAPPC
  71. static yError tpInit(initBlk init);
  72. Handle mmHdlNewClr(lwrd s);
  73. void mmBlkClr(void * p, long s);
  74. void mmBlkCpyCode(const void * p, void * q, long s);
  75. void mmBlkCpy(const void * p, void * q, long s);
  76. void mmBlkSwap(void * p, void * q, long s);
  77. SysProc osTrapSwap(word trapWord, void * newTrapAdr);
  78. SysProc osTrapSwap(word trapWord, word selector,
  79.                     ProcInfoType expectedProcInfo, void * newTrapAdr);
  80. // AKUA Statics End
  81.  
  82.  
  83.  
  84.  
  85. enum TrapReplacement
  86.  {
  87.     ktrLaunch,
  88.     ktrGet1Resource,
  89.     ktrMaxApplZone,
  90.  
  91.     ktrOpenPicture,        // Only set at MaxApplZone
  92.     ktrNewHandle,
  93. //    ktrSetHandleSize,
  94.     ktrNewPtr,
  95.     ktrDisposePtr,
  96.  
  97.     ktrCnt
  98.  };
  99.  
  100.  
  101. // Our globals
  102. ReaperGlo    grp =
  103.  {
  104.     igsReaper,
  105.     kvrReaperCurrent,
  106.     0,
  107.     NULL
  108.  };
  109.  
  110. MonkeyFlag    theMonkey;
  111. SysProc        gatTraps[ktrCnt];
  112. // End globals
  113.  
  114.  
  115.  
  116.  
  117.  
  118.  
  119. oaVal main(oaObj initBlkObj) 
  120.  {
  121.     EnterCodeRsrc();
  122.  
  123.     initBlk        init = (initBlk)initBlkObj;
  124.  
  125.     // bkkEternal - since we stay resident, load and detach 'PREF' resource
  126.     init->flags = bkkEternal;
  127.  
  128.     // Global Initialization
  129.     theMonkey = bEvMonkeyLives | (init->monkey & (bEvMonkeyPowered | bEvMonkeyHasColourQD | bEvMonkeyUseColourQD));
  130.  
  131.     grp.prefs = (BADAPP)init->prefs;
  132.  
  133.     // Set up traps
  134.     yError err = tpInit(init);        // Init Gestalt Entries
  135.  
  136.     // Show our icon, get prefs
  137.     CallObjAgt(init->kickAgt, init);
  138.  
  139. deadlyError:
  140.     LeaveCodeRsrc();
  141.  
  142.     return    err;
  143.  }
  144.  
  145.  
  146.  
  147.  
  148.  
  149. static Ptr xaLMGetFCBSPtr(void)
  150.  {
  151.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  152.     tp        Init
  153.  
  154.     In        InitBlk from main
  155.     Out        
  156.  
  157.     Effect    Fill initBlk with our shit!
  158.  
  159.     Const    
  160.     Errors    
  161.     Flags    
  162.     Global    
  163.     Rsrc    
  164.  
  165.     Version    001
  166.     Notes    
  167.     History
  168.     001    GOD    10.04.96 Use MaxApplZone
  169.     000    
  170.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  171.     if (appItem item = rpFindApp(grp.prefs, kCurrentProcess))
  172.         if (mcObjTst(item, bbaFixFCB))
  173.             goto okToTouch;
  174.  
  175.     SysError(119);
  176.  
  177. okToTouch:
  178.     return    osFCBSPtr;
  179.  }
  180.  
  181.  
  182.  
  183. static SysProc tpLaunchX(LaunchPBPtr pb, OSErr * err)
  184.  {
  185.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  186.     tp        LaunchX
  187.     
  188.     In        
  189.     Out        
  190.  
  191.     Effect    Grab events, check 'em out, and pass 'em on…
  192.             (Keep track of idle for AutoOK function and
  193.              pop-up utility menus when the user has chosen them).
  194.  
  195.     Const    
  196.     Errors    
  197.     Flags    
  198.     Global    
  199.     Rsrc    
  200.  
  201.     Version    001
  202.     Notes    
  203.     History
  204.     001    GOD 12.07.95 wdSelect action moved here
  205.              Action now includes 2 secs or more of
  206.              events not being processed.
  207.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  208.     EnterCodeRsrc();
  209.  
  210.     SysProc    trap = gatTraps[ktrLaunch];
  211.  
  212.     mcObjSet(&grp, brpIsLaunching);
  213.  
  214.  
  215. #if            ISAPPC
  216.         lwrd    * badguy = *(lwrd **)LMGetFCBSPtr;    // Transition vector,  procedure in *tv (RTOC in tv[1])
  217.  
  218.         if (*badguy != 0x7C0802A6L)            // mflr r0
  219.             goto ouch;
  220.  
  221.         if (badguy[3] != 0x38600077L)        // r3=119
  222.             goto ouch;
  223.  
  224.         if (badguy[6] != 0x386068F1L)        // r3=crap
  225.             goto ouch;
  226.  
  227.         if (badguy[7] != 0x3C6368F1L)        // r3=crap
  228.             goto ouch;
  229.  
  230.         lwrd    tv = (lwrd)xaLMGetFCBSPtr;
  231.  
  232.         badguy[7] = badguy[5];                        // Restore RTOC
  233.         badguy[6] = badguy[4] - 4;                                        // bl SysError + 4    - skip R12 load
  234.         badguy[3] = 0x3C600000L + (tv >> 16) + ((tv & 0xFFFF) >> 15);    // lis r3, our adr HI + another bit if our lo word is negative
  235.         badguy[4] = 0x60000000L;                    // NOP
  236.         badguy[5] = 0x39830000L + (tv & 0xFFFF);    // addi r12, r3 + our adr LO
  237. ouch:
  238. #endif    //    ISAPPC
  239.  
  240.  
  241. #if            ISAPPC
  242.     // DebugStr("\pLaunch");
  243.     *err = CallUniversalProc(trap, bpiLaunch, pb);
  244. #else    //    ISAPPC
  245.     *err = (*(trapLaunchProc)trap)(pb);
  246. #endif    //    ISAPPC
  247.  
  248.     mcObjClr(&grp, brpIsLaunching);
  249.  
  250.     LeaveCodeRsrc();
  251.  
  252.     // return    trap;
  253.     return        NULL;
  254.  }
  255.  
  256.  
  257. #if            ISAPPC
  258.  
  259. static SysProcDef xaLaunch = BUILD_ROUTINE_DESCRIPTOR(bpiLaunch, xaLaunchPPC);
  260.  
  261. static pascal OSErr xaLaunchPPC(LaunchPBPtr pb)
  262.  {
  263.     OSErr        err;
  264.  
  265.     if (SysProc p = tpLaunchX(pb, &err))
  266.         err = CallUniversalProc(p, bpiLaunch, pb);
  267.  
  268.     return    err;
  269.  }
  270.  
  271. #else    //    ISAPPC
  272.  
  273. static pascal asm OSErr xaLaunch(void)
  274.  {
  275.     // Parms are in registers!!! Careful
  276.     clr.l        -(sp)                                // Space for real trap
  277.     movem.l        a0-a1/d0-d2, -(sp)
  278.  
  279.     pea            4 + 20 + 4(sp)                        // Space, Regs, RTS Adress (the value of this address is also in d0)
  280.     move.l        a1, -(sp)                            // Event Record *
  281.  
  282.     jsr            tpLaunchX
  283.     addq.w        #8, sp                                // Kill parms
  284.  
  285.     move.l        a0, 20(sp)                            // New rts
  286.     movem.l        (sp)+, a0-a1/d0-d2
  287.  
  288.     move.w        4(sp), d0                            // Restore d0 from new return value
  289.     tst.l        (sp)
  290.     bne.s        @1
  291.     addq.w        #6, sp                                // Kill NULL Trap & word return
  292. @1:    rts
  293.  }
  294.  
  295. #endif    //    ISAPPC
  296.  
  297.  
  298.  
  299.  
  300. static SysProc tpGet1ResourceX(ident kind, short resNum, Handle * retHdl)
  301.  {
  302.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  303.     tp        Get1ResourceX
  304.     
  305.     In        
  306.     Out        
  307.  
  308.     Effect    Grab events, check 'em out, and pass 'em on…
  309.             (Keep track of idle for AutoOK function and
  310.              pop-up utility menus when the user has chosen them).
  311.  
  312.     Const    
  313.     Errors    
  314.     Flags    
  315.     Global    
  316.     Rsrc    
  317.  
  318.     Version    001
  319.     Notes    
  320.     History
  321.     001    GOD 12.07.95 wdSelect action moved here
  322.              Action now includes 2 secs or more of
  323.              events not being processed.
  324.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  325.     EnterCodeRsrc();
  326.  
  327.     SysProc    trap = gatTraps[ktrGet1Resource];
  328.  
  329.     if (!mcObjTst(&grp, brpIsLaunching))
  330.         goto noLunch;
  331.  
  332. #if            ISAPPC
  333.     if (kind == kCFragResourceType)
  334.      {
  335.         if (appItem item = rpFindApp(grp.prefs, CurResFile(), 0))
  336.          {
  337.             if (mcObjTst(item, bbaRun68K))
  338.              {
  339.                 osResErr = resNotFound;
  340.                 trap = NULL;
  341.                 goto noLunch;
  342.              }
  343.          }
  344.      }
  345. #endif    //    ISAPPC
  346.  
  347.  
  348.     if (kind == ircSizeOfHeap)
  349.      {
  350. #if            ISAPPC
  351.         if (Handle hdl = (Handle)CallUniversalProc(trap, bpiGet1Resource, kind, resNum))
  352. #else    //    ISAPPC
  353.         if (Handle hdl = (Handle)(*(tpGet1ResourceProc)trap)(kind, resNum))
  354. #endif    //    ISAPPC
  355.          {
  356.             *retHdl = hdl;
  357.             trap = NULL;
  358.  
  359.             long    originalSize = *(long *)(*hdl + 2);
  360.  
  361.             if (!(originalSize & 0xFF))
  362.              {
  363.                 mmHdlPurgeOff(hdl);
  364.                 *(long *)(*hdl + 2) = rpFindHeapSize(grp.prefs, CurResFile(), originalSize);
  365.              }
  366.          }
  367.      }
  368.  
  369. noLunch:
  370.     LeaveCodeRsrc();
  371.     return    trap;
  372.  }
  373.  
  374.  
  375. #if            ISAPPC
  376.  
  377. static SysProcDef xaGet1Resource = BUILD_ROUTINE_DESCRIPTOR(bpiGet1Resource, xaGet1ResourcePPC);
  378.  
  379. static pascal Handle xaGet1ResourcePPC(ResType kind, short resNum)
  380.  {
  381.     Handle                    h;
  382.  
  383.     if (SysProc p = tpGet1ResourceX(kind, resNum, &h))
  384.         return    (Handle)CallUniversalProc(p, bpiGet1Resource, kind, resNum);
  385.  
  386.     return    h;
  387.  }
  388.  
  389. #else    //    ISAPPC
  390.  
  391. static pascal asm Handle xaGet1Resource(ResType kind, short resID)
  392.  {
  393. //    180    GOD    20.03.96    Lots o' changes, including saving A1 around GetResource since ViseInstaller presumes this
  394. //                         the dickheads!
  395.  
  396.     enum ParmSizes { parmsSize = sizeof(ResType) + sizeof(short) };
  397.  
  398.     movem.l        d1-d2/a1, -(sp)
  399.     subq.w        #4, sp                            // Space for return
  400.     pea            (sp)                            // Pointer to it
  401.     move.w        4 + 8 + 12(sp), -(sp)            // resID @ RetAdr + RetVal + Regs
  402.     move.l        4 + 8 + 12 + 4(sp), -(sp)        // kind @ RetAdr + RetVal + Regs + resID + resID(parm)
  403.     jsr            tpGet1ResourceX
  404.     addq.w        #4, sp
  405.     addq.w        #6, sp
  406.     move.l        (sp)+, parmsSize + 4 + 12(sp);    // Parms + RetAdr + SavedRegs
  407.     movem.l        (sp)+, d1-d2/a1
  408.  
  409.     // Return in a0 for MWC!
  410.     move.l        a0, d0
  411.     bne.s        @1
  412.     move.l        (sp)+, a0            // Caller's address
  413.     addq.w        #parmsSize, sp        // We be pascal
  414.     move.w        kosResErr, d0        // Set r0
  415. @1:    jmp            (a0)
  416.  }
  417.  
  418. #endif    //    ISAPPC
  419.  
  420.  
  421.  
  422.  
  423.  
  424.  
  425. static Handle tpNewHandleX(word tw, Size amt)
  426.  {
  427.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  428.     tp Trap    NewHandleX
  429.     
  430.     In        
  431.     Out        
  432.     Errors    
  433.     Effect    Replace known names with icon suites
  434.     Const    
  435.     Global    
  436.     Rsrc    
  437.     Notes    EnterCodeRsrc() -- SetCurrentA4() must be done by 68K caller!!!
  438.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  439.     Handle            h;
  440.     OSErr            err;
  441.  
  442.     if(!(h = TempNewHandle(amt, &err)) || err)
  443.      {
  444.         h = NULL;
  445.         osMemErr = err;
  446.         // Go for alternate zones - going for Sys may loop back to us!
  447. //        h = NewHandleSys(amt);
  448.      }
  449.     else if (mcFlagTst(tw, bosTrapIsClr))
  450.         mmBlkClr(*h, amt);
  451.  
  452.     return    h;
  453.  }
  454.  
  455.  
  456. // GLUE Code for tpNewHandle
  457. #if            ISAPPC
  458.  
  459. static RoutineDescriptor xaNewHandle = BUILD_ROUTINE_DESCRIPTOR(bpiNewHandle, xaNewHandlePPC);
  460.  
  461. static pascal Handle xaNewHandlePPC(word tw, Size amt)
  462.  {
  463.     Handle        h;
  464.  
  465.  
  466.     if (!(h = (Handle)CallOSTrapUniversalProc(gatTraps[ktrNewHandle], bpiNewHandle, tw, amt)))
  467.         if (!mcFlagTst(tw, bosTrapIsSys) && (osTheZone == osApplZone))
  468.             h = tpNewHandleX(tw, amt);
  469.  
  470.     return    h;
  471.  }
  472.  
  473.  
  474.  
  475. static RoutineDescriptor xaNewHandleSmart = BUILD_ROUTINE_DESCRIPTOR(bpiNewHandle, xaNewHandleSmartPPC);
  476.  
  477. static pascal Handle xaNewHandleSmartPPC(word tw, Size amt)
  478.  {
  479.     Handle        h        = NULL;
  480.     bool        smart    = !mcFlagTst(tw, bosTrapIsSys) && (osTheZone == osApplZone);
  481.  
  482.  
  483.     // From OpenPicture?
  484.     if (smart)
  485.         if (mcObjTst(&grp, brpInOpenPicture) || (amt > (osTheZone->zcbFree >> 2)))
  486.             if (osTheZone->zcbFree < TempFreeMem()) // grp.tmpZone->zcbFree)
  487.                 h = tpNewHandleX(tw, amt);
  488.  
  489.     if (!h)
  490.         if (!(h = (Handle)CallOSTrapUniversalProc(gatTraps[ktrNewHandle], bpiNewHandle, tw, amt)))
  491.             if (smart)
  492.                 h = tpNewHandleX(tw, amt);
  493.  
  494.     return    h;
  495.  }
  496.  
  497. #else    //    ISAPPC
  498.  
  499. static pascal asm void xaNewHandle(void)    // Parameter in register d0, trapWord in d1
  500.  {
  501.     movem.l        d1-d4/a1-a4, -(sp)
  502.  
  503.     move.l        d0, d3
  504.     move.w        d1, d4
  505.  
  506.     // Access to our globals
  507.     jsr            SetCurrentA4
  508.  
  509. //    _Debugger
  510.  
  511.     // In System Heap - Leave it alone
  512.     btst        #bosTrapIsSysBit, d4
  513.     bne            @7
  514.  
  515.     // Not App Zone - leave it alone
  516.     move.l        kosApplZone, d0
  517.     move.l        kosTheZone, d1
  518.     cmp.l        d1, d0
  519.     beq            @6
  520.  
  521. @7:    // System or other zone - out of here!
  522.     move.l        d3, d0
  523.     move.l        gatTraps + (ktrNewHandle * 4), a0
  524.     movem.l        (sp)+, d1-d4/a1-a4
  525.     jmp            (a0)
  526.  
  527.     // Quick Check if that much is free
  528. /*    move.l        kosTheZone, a0
  529.     addq.w        #8, a0
  530.     addq.w        #4, a0
  531.     move.l        (a0), d0        // zcbFree
  532.     sub.l        #10240, d0        // reserve for emergencies
  533.     cmp.l        d3, d0
  534.     blt            @4
  535. */
  536. @6:    // Call original NewHandle
  537.     move.l        d3, d0
  538.     // Restore d1 (trapWord)
  539.     move.w        d4, d1
  540.     move.l        gatTraps + (ktrNewHandle * 4), a0
  541.     jsr            (a0)
  542.     tst.w        d0
  543.     beq            @2
  544.  
  545. @4:    // _Debugger
  546.  
  547.     move.l        d3, -(sp)
  548.     move.w        d4, -(sp)
  549.     jsr            tpNewHandleX
  550.     addq.w        #6, sp
  551.  
  552. @3:    move.w        kosMemErr, d0
  553.  
  554. @2:    movem.l        (sp)+, d1-d4/a1-a4    // Restores A4
  555. @1:    rts
  556.  }
  557.  
  558.  
  559.  
  560. static pascal asm void xaNewHandleSmart(void)    // Parameter in register d0, trapWord in d1
  561.  {
  562.     movem.l        d1-d4/a1-a4, -(sp)
  563.  
  564.     move.l        d0, d3
  565.     move.w        d1, d4
  566.  
  567.     // Access to our globals
  568.     jsr            SetCurrentA4
  569.  
  570.     // In System Heap - Leave it alone
  571.     btst        #bosTrapIsSysBit, d4
  572.     bne            @7
  573.  
  574.     // Not App Zone - leave it alone
  575.     move.l        kosApplZone, d0
  576.     move.l        kosTheZone, d1
  577.     cmp.l        d1, d0
  578.     beq            @6
  579.  
  580. @7:    // System or other zone - out of here!
  581.     move.l        d3, d0
  582.     move.l        gatTraps + (ktrNewHandle * 4), a0
  583.     movem.l        (sp)+, d1-d4/a1-a4
  584.     jmp            (a0)
  585.  
  586. @6:    // How much do we have avail?
  587.     move.l        kosTheZone, a0
  588.     addq.w        #8, a0
  589.     addq.w        #4, a0
  590.     move.l        (a0), d0        // zcbFree
  591.     move.l        d0, d1            // … to D1
  592.     asr.l        #2, d0            // 1/4 to D0
  593.  
  594.     // Quick Check if that much is free
  595.     cmp.l        d3, d0            // d0 (free >> 2) > d3 (amt) ?
  596.     ble            @5
  597.  
  598.     // From OpenPicture()?
  599.     move.w        grp.flags, d0
  600.     btst        #brpInOpenPictureBit, d0
  601.     beq            @0        // Go for the bigger zone
  602.  
  603. @5:    // Check if more temp is available than our zone
  604. /*
  605. @5:    move.l        grp.tmpZone, a0
  606.     addq.w        #8, a0
  607.     addq.w        #4, a0
  608.     move.l        (a0), d0
  609. */
  610.     move.l        d1, a3
  611.     subq.w        #4, sp
  612.     moveq        #0x18, d0            // _TempFreeMem
  613.     move.w        d0, -(sp)
  614.     _OSDispatch
  615.     move.l        (sp)+, d0
  616.     move.l        a3, d1
  617.     cmp.l        d0, d1            // D1 (app) > D0 (tmp) ?
  618.     bgt            @0                // Skip it, app has more
  619.  
  620.     // Get some temp mem
  621.     move.l        d3, -(sp)
  622.     move.w        d4, -(sp)
  623.     jsr            tpNewHandleX
  624.     addq.w        #6, sp
  625.     tst.w        kosMemErr
  626.     beq            @3
  627.  
  628.     // Call original NewHandle
  629. @0:    move.l        d3, d0
  630.     // Restore d1 (trapWord)
  631.     move.w        d4, d1
  632.     move.l        gatTraps + (ktrNewHandle * 4), a0
  633.     jsr            (a0)
  634.     tst.w        d0
  635.     beq            @2
  636.  
  637. @4:    // _Debugger
  638.  
  639.     move.l        d3, -(sp)
  640.     move.w        d4, -(sp)
  641.     jsr            tpNewHandleX
  642.     addq.w        #6, sp
  643.  
  644. @3:    move.w        kosMemErr, d0
  645.  
  646. @2:    movem.l        (sp)+, d1-d4/a1-a4    // Restores A4
  647. @1:    rts
  648.  }
  649.  
  650. #endif    //    ISAPPC
  651.  
  652.  
  653.  
  654.  
  655.  
  656.  
  657. static Ptr tpNewPtrX(word tw, Size amt)
  658.  {
  659.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  660.     tp Trap    NewPtrX
  661.     
  662.     In        
  663.     Out        
  664.     Errors    
  665.     Effect    Replace known names with icon suites
  666.     Const    
  667.     Global    
  668.     Rsrc    
  669.     Notes    
  670.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  671.     EnterCodeRsrc();
  672.  
  673.     Ptr                p;
  674.  
  675. #if            ISAPPC
  676.     if (!(p = (Ptr)CallOSTrapUniversalProc(gatTraps[ktrNewPtr], bpiNewPtr, tw, amt)))
  677. #else    //    ISAPPC
  678.     if (!(p = (Ptr)(*(trapNewPtrProc)gatTraps[ktrNewPtr])(tw, amt)))
  679. #endif    //    ISAPPC
  680.      {
  681.         // Try system heap if we not already in System heap…
  682.         if (!(tw & bosTrapIsSys))
  683. #if            ISAPPC
  684.             p = (Ptr)CallOSTrapUniversalProc(gatTraps[ktrNewPtr], bpiNewPtr, tw | bosTrapIsSys, amt);
  685. #else    //    ISAPPC
  686.             p = (Ptr)(*(trapNewPtrProc)gatTraps[ktrNewPtr])(tw | bosTrapIsSys, amt);
  687. #endif    //    ISAPPC
  688.  
  689.         if (!p)
  690.          {
  691.             Handle        h;
  692.  
  693.             if (h = tpNewHandleX(tw, amt + 12))
  694.              {
  695.                 ident        * id;
  696.  
  697.                 mmHdlLock(h);
  698.                 id = (ident *)*h;
  699.                 *id++ = igsReaper;    // Mark as a pointer
  700.                 *id++ = 'Ptr ';
  701.                 *id++ = (lwrd)h;
  702.                 p = (Ptr)id;
  703.              }
  704.          }
  705.      }
  706.  
  707.     LeaveCodeRsrc();
  708.  
  709.     return    p;
  710.  }
  711.  
  712.  
  713. // GLUE Code for tpNewPtr
  714. #if        ISAPPC
  715.  
  716. static RoutineDescriptor xaNewPtr = BUILD_ROUTINE_DESCRIPTOR(bpiNewPtr, xaNewPtrPPC);
  717.  
  718. static pascal Ptr xaNewPtrPPC(word tw, Size amt)
  719.  {
  720.     return    tpNewPtrX(tw, amt);
  721.  }
  722.  
  723. #else
  724.  
  725. static pascal asm void xaNewPtr(void)    // Parameter in register d0
  726.  {
  727.     movem.l        d1-d2/a1, -(sp)
  728.  
  729.     move.l        d0, -(sp)
  730.     move.w        d1, -(sp)
  731.  
  732.     jsr            tpNewPtrX
  733.  
  734.     addq.w        #6, sp
  735.     move.w        kosMemErr, d0
  736.     movem.l        (sp)+, d1-d2/a1
  737.     rts
  738.  }
  739.  
  740. #endif    //    ISAPPC
  741.  
  742.  
  743.  
  744.  
  745.  
  746.  
  747. static SysProc tpDisposePtrX(word tw, Ptr p)
  748.  {
  749.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  750.     tp Trap    DisposePtrX
  751.     
  752.     In        
  753.     Out        
  754.     Errors    
  755.     Effect    Replace known names with icon suites
  756.     Const    
  757.     Global    
  758.     Rsrc    
  759.     Notes    
  760.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  761.     EnterCodeRsrc();
  762.  
  763.     SysProc    trap = gatTraps[ktrDisposePtr];
  764.  
  765.     // One of our pseudo pointers?
  766.     if (!p)
  767.      {
  768.         trap = NULL;
  769.         osMemErr = 0;
  770.      }
  771.     else if (  (*(ident *)(p - 8) == 'Ptr ')
  772.             && (*(ident *)(p - 12) == igsReaper))
  773.      {
  774.         trap = NULL;
  775.         mmHdlDel(*(Handle *)(p - 4));
  776.      }
  777.  
  778.     LeaveCodeRsrc();
  779.  
  780.     return    trap;
  781.  }
  782.  
  783.  
  784. // GLUE Code for tpDisposePtr
  785. #if            ISAPPC
  786.  
  787. static RoutineDescriptor xaDisposePtr = BUILD_ROUTINE_DESCRIPTOR(bpiDisposePtr, xaDisposePtrPPC);
  788.  
  789. static pascal void xaDisposePtrPPC(word tw, Ptr p)
  790.  {
  791.     if (SysProc trap = tpDisposePtrX(tw, p))
  792.         CallOSTrapUniversalProc(trap, bpiDisposePtr, tw, p);
  793.  }
  794.  
  795. #else    //    ISAPPC
  796.  
  797. static pascal asm void xaDisposePtr(void)    // Parameter in register a0
  798.  {
  799.     movem.l        d1-d2/a1, -(sp)
  800.  
  801.     move.l        a0, -(sp)
  802.     move.w        d1, -(sp)                // Trapword
  803.  
  804.     jsr            tpDisposePtrX
  805.  
  806.     addq.w        #2, sp                    // Trapword
  807.     move.l        a0, d0
  808.  
  809.     move.l        (sp)+, a0
  810.     movem.l        (sp)+, d1-d2/a1
  811.  
  812.     beq.s        @1
  813.     move.l        d0, -(sp)                // Real trap
  814. @1:    rts
  815.  }
  816.  
  817. #endif    //    ISAPPC
  818.  
  819.  
  820.  
  821.  
  822.  
  823.  
  824. static PicHandle tpOpenPictureX(rect box)
  825.  {
  826.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  827.     tp Trap    OpenPictureX
  828.     
  829.     In        
  830.     Out        
  831.  
  832.     Effect    Replace NewHandle and NewPtr with our versions
  833.              if the app is in our prefs resource and the
  834.              traps have not been already zapped
  835.  
  836.     Const    
  837.     Errors    
  838.     Flags    
  839.  
  840.     Global    
  841.     Rsrc    
  842.  
  843.     Version    000
  844.     Notes    
  845.     History
  846.     000    GOD    10.04.96 Start
  847.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  848.     EnterCodeRsrc();
  849.     mcObjSet(&grp, brpInOpenPicture);
  850.  
  851.     PicHandle pic = CallTrapOpenPicture(gatTraps[ktrOpenPicture], box);
  852.  
  853.     mcObjClr(&grp, brpInOpenPicture);
  854.     LeaveCodeRsrc();
  855.  
  856.     return    pic;
  857.  }
  858.  
  859.  
  860. // GLUE Code for tpNewHandle
  861. #if            ISAPPC
  862.  
  863. static RoutineDescriptor xaOpenPicture = BUILD_ROUTINE_DESCRIPTOR(bpiOpenPicture, xaOpenPicturePPC);
  864.  
  865. static pascal PicHandle xaOpenPicturePPC(rect box)
  866.  {
  867.     return    tpOpenPictureX(box);
  868.  }
  869.  
  870. #else    //    ISAPPC
  871.  
  872. static pascal asm void xaOpenPicture(void)
  873.  {
  874.     move.l        4(sp), a0            // Box parm
  875.     move.l        (sp)+, (sp)            // Kill it
  876.     movem.l        d0-d2/a1, -(sp)
  877.     move.l        a0, -(sp)            // Box parm
  878. //    _Debugger
  879.     jsr            tpOpenPictureX
  880.     addq.w        #4, sp                // Kill box parm
  881.     movem.l        (sp)+, d0-d2/a1
  882.     move.l        a0, 4(sp)
  883.     rts
  884.  }
  885.  
  886. #endif    //    ISAPPC
  887.  
  888.  
  889.  
  890.  
  891.  
  892.  
  893. static SysProc tpMaxApplZoneX(void)
  894.  {
  895.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  896.     tp Trap    MaxApplZoneX
  897.     
  898.     In        
  899.     Out        
  900.  
  901.     Effect    Replace NewHandle and NewPtr with our versions
  902.              if the app is in our prefs resource and the
  903.              traps have not been already zapped
  904.  
  905.     Const    
  906.     Errors    
  907.     Flags    
  908.  
  909.     Global    
  910.     Rsrc    
  911.  
  912.     Version    000
  913.     Notes    
  914.     History
  915.     000    GOD    10.04.96 Start
  916.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  917.     EnterCodeRsrc();
  918.  
  919.     bool    expansion    = FALSE;
  920.     bool    smart        = FALSE;
  921.  
  922. //    mcObjClr(&grp, brpIsLaunching);    // Can't be launching now?!?
  923.  
  924.     if (appItem item = rpFindApp(grp.prefs, kCurrentProcess))
  925.      {
  926.         expansion    = mcObjBool(item, bbaExpand);
  927.         smart        = mcObjBool(item, bbaSmartHeap);
  928.  
  929. /*
  930.         yError    err;
  931.  
  932.         if (1)
  933.             grp.tmpZone = osTwitchZone;
  934.         else if (Handle crap = TempNewHandle(3, &err))
  935.          {
  936.             grp.tmpZone = HandleZone(crap);
  937.             mmHdlDel(crap);
  938.          }
  939. */     }
  940.     else
  941.      {
  942.         // Reget trap info
  943.         gatTraps[ktrOpenPicture]    = osTrapSwap(_OpenPicture, NULL);
  944.         gatTraps[ktrNewHandle]        = osTrapSwap(_NewHandle, NULL);
  945.         gatTraps[ktrNewPtr]            = osTrapSwap(_NewPtr, NULL);
  946.         gatTraps[ktrDisposePtr]        = osTrapSwap(_DisposePtr, NULL);
  947.      }
  948.  
  949.     if ((expansion || smart) && (osTrapSwap(_NewHandle, NULL) != (smart ? &xaNewHandleSmart : &xaNewHandle)))
  950.      {
  951.         // Replace the traps
  952.         if (osTrapSwap(_NewHandle, smart ? &xaNewHandleSmart : &xaNewHandle) != gatTraps[ktrNewHandle])
  953.          {
  954. //            Debugger();
  955. //            osTrapSwap(_NewHandle, original);
  956. //            SysBeep(9);
  957.          }
  958.  
  959.         if (expansion)
  960.          {
  961.             if (osTrapSwap(_NewPtr, &xaNewPtr) != gatTraps[ktrNewPtr])
  962.              {
  963. //                Debugger();
  964. //                osTrapSwap(_NewPtr, original);
  965. //                SysBeep(9);
  966.              }
  967.         
  968.             if (osTrapSwap(_DisposePtr, &xaDisposePtr) != gatTraps[ktrDisposePtr])
  969.              {
  970. //                Debugger();
  971. //                osTrapSwap(_DisposePtr, original);
  972. //                SysBeep(9);
  973.              }
  974.          }
  975.         
  976.         if (smart)
  977.          {
  978.             if (osTrapSwap(_OpenPicture, &xaOpenPicture) != gatTraps[ktrOpenPicture])
  979.              {
  980. //                Debugger();
  981. //                osTrapSwap(_DisposePtr, original);
  982. //                SysBeep(9);
  983.              }
  984.          }
  985.      }
  986.  
  987.     SysProc    trap = gatTraps[ktrMaxApplZone];
  988.  
  989.     LeaveCodeRsrc();
  990.  
  991.     return    trap;
  992.  }
  993.  
  994.  
  995. // GLUE Code for tpNewHandle
  996. #if            ISAPPC
  997.  
  998. static RoutineDescriptor xaMaxApplZone = BUILD_ROUTINE_DESCRIPTOR(bpiMaxApplZone, xaMaxApplZonePPC);
  999.  
  1000. static pascal void xaMaxApplZonePPC(void)
  1001.  {
  1002.     CallOSTrapUniversalProc(tpMaxApplZoneX(), bpiMaxApplZone);
  1003.  }
  1004.  
  1005. #else    //    ISAPPC
  1006.  
  1007. static pascal asm void xaMaxApplZone(void)
  1008.  {
  1009.     movem.l        d0-d2/a1, -(sp)
  1010.     jsr            tpMaxApplZoneX
  1011.     movem.l        (sp)+, d0-d2/a1
  1012.     jmp            (a0)
  1013.  }
  1014.  
  1015. #endif    //    ISAPPC
  1016.  
  1017.  
  1018.  
  1019.  
  1020.  
  1021. static yError tpInit(initBlk init)
  1022.  {
  1023.  /* ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––
  1024.     tp        Init
  1025.  
  1026.     In        InitBlk from main
  1027.     Out        
  1028.  
  1029.     Effect    Fill initBlk with our shit!
  1030.  
  1031.     Const    
  1032.     Errors    
  1033.     Flags    
  1034.     Global    
  1035.     Rsrc    
  1036.  
  1037.     Version    001
  1038.     Notes    
  1039.     History
  1040.     001    GOD    10.04.96 Use MaxApplZone
  1041.     000    
  1042.  ––––––––––––––––––––––––––––––––––––––––––––––––––––––––––– */
  1043.     trapTable                traps;
  1044.  
  1045.  
  1046.     // Our Trap Table
  1047.     init->traps = traps = (trapTable)NewPtrSysClear(sizeof(TrapTable) + (sizeof(TrapTableItem) * (ktrCnt - 1)));
  1048.  
  1049.     if (!traps)
  1050.         return    memFullErr;
  1051.  
  1052.     traps->originalTraps = gatTraps;
  1053.  
  1054.     // The traps we patch
  1055.     int                cnt    = 1;
  1056.     trapTableItem    t    = traps->item;
  1057.  
  1058.     t->trapWord    = _Launch;
  1059.     t->agt        = &xaLaunch;
  1060.  
  1061.     ++ cnt;
  1062.     ++t;
  1063.     t->trapWord    = _Get1Resource;
  1064.     t->agt        = &xaGet1Resource;
  1065.  
  1066.     ++ cnt;
  1067.     ++t;
  1068.     t->trapWord    = _MaxApplZone;
  1069.     t->agt        = &xaMaxApplZone;
  1070.  
  1071.     // Just for inquiry
  1072.     ++ cnt;
  1073.     ++ t;
  1074.     t->trapWord = _OpenPicture;
  1075.  
  1076.     ++ cnt;
  1077.     ++ t;
  1078.     t->trapWord = _NewHandle;
  1079.  
  1080.     ++ cnt;
  1081.     ++ t;
  1082.     t->trapWord = _NewPtr;
  1083.  
  1084.     ++ cnt;
  1085.     ++ t;
  1086.     t->trapWord = _DisposePtr;
  1087.  
  1088.     // Our gestalts
  1089.     if (init->gestVals)
  1090.         init->gestVals->item[0].value = (long)&grp;
  1091.  
  1092.     // Set the number of traps we want
  1093.     traps->cnt = cnt;
  1094.  
  1095.     return    noErr;
  1096.  }
  1097.  
  1098.  
  1099.  
  1100.  
  1101.  
  1102.  
  1103. #include    "mmBlkClr.c"
  1104. #include    "osTrapSwap.c"
  1105.